function [result_image] = dithering_random(original_image, result_bits, noise_ratio)
% DITHERING

% Algoritmo random
% - Aggiunge rumore casuale nel calcolo della quantizzazione
%   col risultato di ottenere un effetto 'analogico' senza bande

% Profondita' in bit dell'immagine originale
original_bits = 8;
original_levels = 2^original_bits-1;

% Setto il numero di bit dell'immagine in uscita (< di quello in entrata)
result_levels = 2^result_bits-1;

% Creo il frame dell'immagine risultante
result_image = zeros(size(original_image, 1),...
    size(original_image, 2),...
    size(original_image, 3));

% Estremi di effettivita' del rumore
noise_limit = result_levels * noise_ratio;
noise_offset = -noise_limit/2;

% ALGORITMO
% per ogni canale colore
for c = 1:size(original_image, 3)

    % per ogni y (da sopra a sotto)
    for y = 2:size(result_image, 1)-1

        % per ogni x (da sinistra a destra)
        for x = 2:size(result_image, 2)-1

            % prendo il pixel originale
            old_pixel = original_image(y,x,c);

            % quantizzo il pixel aggiungendo rumore alla quantizzazione
            new_pixel = round(...
                double(old_pixel) * (result_levels/original_levels) +...
                (rand() * noise_limit + noise_offset)) *...
                (original_levels/result_levels);

            result_image(y,x,c) = new_pixel;
        end
    end
end

end